<?php
namespace ZyucMini\Core;

/**
 * 响应类 - 负责HTTP响应管理
 * 用于处理HTTP响应，设置响应头，返回响应数据等
 *
 * @package ZyucMini\Core
 * @author 黄凯
 */
class Response
{
    /**
     * 构造函数
     */
    public function __construct()
    {
        $this->isCli = php_sapi_name() === 'cli';
    }
    /**
     * HTTP 状态码
     * @var int
     */
    protected $statusCode = 200;

    /**
     * 响应头数组
     * @var array
     */
    protected $headers = [];

    /**
     * 是否已发送响应头
     * @var bool
     */
    protected $headersSent = false;
    
    /**
     * 是否为命令行环境
     * @var bool
     */
    protected $isCli = false;

    /**
     * 设置HTTP状态码
     * @param int $code HTTP状态码
     * @return Response
     */
    public function setStatusCode($code)
    {
        $this->statusCode = (int)$code;
        return $this;
    }

    /**
     * 设置响应头
     * @param string $name 响应头名称
     * @param string $value 响应头值
     * @return Response
     */
    public function setHeader($name, $value)
    {
        $this->headers[$name] = $value;
        return $this;
    }

    /**
     * 发送纯文本响应
     * @param string $content 文本内容
     * @param int|null $statusCode HTTP状态码
     * @return void
     */
    public function text($content, $statusCode = null)
    {
        if ($statusCode !== null) {
            $this->setStatusCode($statusCode);
        }

        // 只在非命令行环境下设置HTTP响应头
        if (!$this->isCli) {
            $this->setHeader('Content-Type', 'text/plain; charset=utf-8');
            $this->sendHeaders();
        }
        
        echo $content;
        
        // 只在非命令行环境下退出
        if (!$this->isCli) {
            exit;
        }
    }

    /**
     * 发送JSON响应
     * @param mixed $data 要编码的数据
     * @param int|null $statusCode HTTP状态码
     * @return void
     */
    public function json($data, $statusCode = null)
    {
        if ($statusCode !== null) {
            $this->setStatusCode($statusCode);
        }

        // 只在非命令行环境下设置HTTP响应头
        if (!$this->isCli) {
            $this->setHeader('Content-Type', 'application/json; charset=utf-8');
            $this->sendHeaders();
        }
        
        $json = json_encode($data, JSON_UNESCAPED_UNICODE);
        if ($json === false) {
            throw new \RuntimeException('JSON encoding failed: ' . json_last_error_msg());
        }
        
        echo $json;
        
        // 只在非命令行环境下退出
        if (!$this->isCli) {
            exit;
        }
    }

    /**
     * 发送响应头
     * @return void
     */
    protected function sendHeaders()
    {
        // 命令行环境下不发送HTTP响应头
        if ($this->isCli || $this->headersSent) {
            return;
        }
        
        http_response_code($this->statusCode);
        foreach ($this->headers as $name => $value) {
            header("$name: $value");
        }
        
        $this->headersSent = true;
    }

    /**
     * 获取当前状态码
     * @return int
     */
    public function getStatusCode()
    {
        return $this->statusCode;
    }

    /**
     * 获取所有响应头
     * @return array
     */
    public function getHeaders()
    {
        return $this->headers;
    }

    /**
     * 检查是否已发送响应头
     * @return bool
     */
    public function isHeadersSent()
    {
        return $this->headersSent;
    }
    
    /**
     * 检查是否为命令行环境
     * @return bool
     */
    public function isCli()
    {
        return $this->isCli;
    }
    
    /**
     * 发送普通输出（不设置HTTP头，不退出）
     * @param string $content 内容
     * @return void
     */
    public function output($content)
    {
        echo $content;
    }
    
    /**
     * 发送换行输出
     * @param string $content 内容
     * @return void
     */
    public function line($content = '')
    {
        echo $content . PHP_EOL;
    }
}
?>